/**
 * @use 对象数组根据其中一个属性名去重
 * @param arr 对象数组
 * @param key 数组中某个属性
 * @returns 根据key去重后的数组
 */
export const repeat = (arr, key) => {
  const map = new Map();
  return arr.filter((item) => {
    return !map.has(item[key]) && map.set(item[key], item);
  });
};

/**
 * @use 两个对象数组根据其中一个属性名求差集
 * @param arr1 对象数组1
 * @param arr2 对象数组2
 * @param key  数组中某个属性
 * @returns 差集后的数组
 */
export const diff = (arr1, arr2, key) => {
  return arr1.filter((item) => {
    return arr2.every((it) => it[key] !== item[key]);
  });
};

/**
 * @use 两个对象数组根据其中一个属性名求交集
 * @param {*} arr1 对象数组1
 * @param {*} arr2 对象数组2
 * @param {*} key  数组中某个属性
 * @returns  交集后的数据
 */
export const intersect = (arr1, arr2, key) => {
  return arr1.filter((item) => {
    return arr2.some((e) => e[key] == item[key]);
  });
};

/**
 * @use 并集
 * @param {*} arr1 对象数组1
 * @param {*} arr2 对象数组2
 * @param {*} key  数组中某个属性
 * @returns  并集后的数据
 */
export const union = (arr1, arr2, key) => {
  // 合并后去重
  return repeat([...arr1, ...arr2], key);
};

/**
 * @use 补集方法一
 * @param {*} arr1 对象数组1
 * @param {*} arr2 对象数组2
 * @param {*} key  数组中某个属性
 * @returns  补集后的数据
 */
export const complement = (arr1, arr2, key) => {
  const diff1 = diff(arr1, arr2, key);
  const diff2 = diff(arr2, arr1, key);
  return [...diff1, ...diff2];
};

/**
 * @use 补集方法二
 * @param {*} arr1 对象数组1
 * @param {*} arr2 对象数组2
 * @param {*} key  数组中某个属性
 * @returns  补集后的数据
 */
export const complement2 = (arr1, arr2, key) => {
  // 并集
  const uni = union(arr1, arr2, key);
  // 交集
  const inter = intersect(arr1, arr2, key);
  return diff(uni, inter, key);
};

/**
 * @use 取消字段选择功能
 */
export const notSelect = () => {
  document.onselectstart = function () {
    return false;
  };
};

/**
 * @description 获取localStorage
 * @param {String} key Storage名称
 * @returns {String}
 */
export const localGet = (key) => {
  const value = localStorage.getItem(key);
  try {
    return JSON.parse(window.localStorage.getItem(key));
  } catch (error) {
    return value;
  }
};

/**
 * @description 存储localStorage
 * @param {String} key Storage名称
 * @param {*} value Storage值
 * @returns {void}
 */
export const localSet = (key, value) => {
  localStorage.setItem(key, JSON.stringify(value));
};

/**
 * @description 清除localStorage
 * @param {String} key Storage名称
 * @returns {void}
 */
export const localRemove=(key)=> {
  localStorage.removeItem(key);
}

/**
 * @description 清除所有localStorage
 * @returns {void}
 */
export const localClear = () => {
  localStorage.clear();
};
